package com.suke.czx.modules.sys.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.suke.czx.common.utils.Constant;
import com.suke.czx.common.utils.R;
import com.suke.czx.modules.sys.entity.SysRole;
import com.suke.czx.modules.sys.entity.SysRoleMenu;
import com.suke.czx.modules.sys.mapper.SysRoleMapper;
import com.suke.czx.modules.sys.mapper.SysRoleMenuMapper;
import com.suke.czx.modules.sys.service.SysRoleMenuService;
import com.suke.czx.modules.sys.service.SysRoleService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Arrays;
import java.util.Date;
import java.util.stream.Collectors;

/**
 * 应用模块名称: 系统角色
 * 代码描述: 系统角色业务层
 * copyright: AUZAR ALL RIGHTS RESERVED
 * company: AUZAR
 *
 * @author: 颜米晨
 * @date: 2021/08/27 16:31
 */
@Service
@AllArgsConstructor
public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements SysRoleService {

	private final SysRoleMenuService sysRoleMenuService;

	private final SysRoleMenuMapper sysRoleMenuMapper;

	/**
	 * 保存角色
	 * @param role 角色
	 * @return VO
	 */
	@Override
	@Transactional(rollbackFor = Exception.class)
	public R saveRole(SysRole role) {
		role.setMenuIdList(Arrays.stream(StrUtil.split(role.getMenuIds(), Constant.COMMA)).map(Long::valueOf).collect(Collectors.toList()));
		role.setCreateTime(new Date());
		baseMapper.insert(role);
		//保存角色与资源关系
		sysRoleMenuService.fullUpdateRoleMenuList(role.getRoleId(), role.getMenuIdList());
		return R.ok();
	}

	/**
	 * 更新角色
	 * @param role 角色
	 * @return VO
	 */
	@Override
	@Transactional(rollbackFor = Exception.class)
	public R updateRole(SysRole role) {
		role.setMenuIdList(Arrays.stream(StrUtil.split(role.getMenuIds(), Constant.COMMA)).map(Long::valueOf).collect(Collectors.toList()));
		baseMapper.updateById(role);
		//保存角色与资源关系
		sysRoleMenuService.fullUpdateRoleMenuList(role.getRoleId(), role.getMenuIdList());
		return R.ok();
	}

	/**
	 * 删除角色
	 * @param roleId 角色编码
	 * @return VO
	 */
	@Override
	@Transactional(rollbackFor = Exception.class)
	public R deleteRole(Long roleId) {
		// 管理员角色不能删除
		if (roleId == 1) {
			return R.error("管理员角色不能删除");
		}
		baseMapper.deleteById(roleId);
		// 删除角色和资源关系
		sysRoleMenuMapper.delete(Wrappers.<SysRoleMenu>query().lambda().eq(SysRoleMenu::getRoleId, roleId));
		return R.ok();
	}

}
